{{tag>BROUILLON}}
====== Samba - Active Directory Domain Controller (AD DC) ======

Brouillon avant de compléter ou créer un nouvelle page concernant l'authentification d'un utilisateur avec Samba AD DC

La version actuelle se trouve ici [[:samba-active-directory|Samba - Active Directory Domain Controller (AD DC)]]
...

===== Versions =====
...
===== Installation de Samba=====
==== Paramètres généraux ====
Avant toute installation, il est nécessaire de définir son environnement. Ainsi, il sera possible de configurer correctement son serveur. Le reste de cette documentation se basera sur les paramètres suivants :

|Nom de domaine |example.com | \\ RFC 2606
|Royaume (realm) |EXAMPLE.COM |
|Nom de NetBIOS |example |
|Nom du serveur |ubndc01 |
|Adresse IP du serveur |192.168.1.11 |
|Rôle du serveur |DC (contrôleur de domaine) |
==== Pré-requis ====
...
==== Installation à partir des dépôts ====
...
==== Installation à partir des sources ====
...
===== Création d'un premier DC dans une nouvelle forêt =====
...
==== Initialisation de Samba ====
...
==== Démarrer Samba AD DC ====
...
===== Test de Samba AD DC =====
...
==== Tests des ACL ====
...
==== Tests des attributs étendus ====
...
==== Tests du DNS ====
...
==== Tests de Kerberos ====
...
==== Tests de SMB ====
...
===== Mise à jour depuis un domaine Samba de type NT4 vers un AD=====
...
===== Authentification avec Samba AD DC =====
==== Authentification des utilisateurs sur le DC ====
Afin de réaliser l'authentification des utilisateurs d'AD, plusieurs méthodes existent :
  * [[https://wiki.samba.org/index.php/Local_user_management_and_authentication/sssd|sssd et pam_sss]]
  * [[https://wiki.samba.org/index.php/Local_user_management_and_authentication/nslcd|nslcd et pam_ldap]]
  * [[https://wiki.samba.org/index.php/Samba4/Winbind|winbind et pam_winbind]]
Seule cette dernière méthode est expliquée dans cette documentation.

Les paquets suivants sont requis pour la mise en œuvre de cette authentification.
<code>sudo apt-get install libnss-winbind libpam-winbind winbind</code>

Premièrement, il faut configurer le Name Service Switch (nsswitch) par l'ajout de winbind comme méthode pour les sections //passwd// et //group//
<file - /etc/nsswitch.conf>...
    passwd: compat winbind
    group:  compat winbind
...
</file>

Ceci permet d'utiliser les utilisateurs et groupes venant de AD.
Par défaut sur un DC, les commandes ci-dessous retourne la liste de tous les utilisateurs et groupes.
<code>getent passwd
getent group</code>

Création du home directory pour l'utilisateur du domaine.
<file - /usr/share/pam-configs/mkhomedir>
Default: no
Priority: 900
Session-Type: Additional
Session-Final:
        required        pam_mkhomedir.so skel=/etc/skel umask=0077 silent
</file>

Alternative en mofdifiant le fichier /usr/share/pam-config/winbind
<file - /usr/share/pam-config/winbind>...
Session:
        optional                        pam_winbind.so mkhomedir
...</file>

Un autre alternative consiste à monter le home directory de l'utilisateur lors du login. Une option du fichier de configuration /etc/samba/smb.conf est //homedir map = auto.home//. Ceci fait référence à autofs. Développement Ult.

Possibilité de limiter l'accès à un ou plusieurs groupes ou utilisateurs sur base du SID
Ajouter require_membership_of=SID à la fin de la ligne pam_winbind.so de la section Auth: du fichier /usr/share/pam-config/winbind
<file - /usr/share/pam-config/winbind>...
Auth:
        [success=end default=ignore]    pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass required_membership_of=S-1-5-21-5555555555-555555555-5555555555-512
...</file>
Le RID 512 représente le groupe //Domain Admins//

Activer cette nouvelle configuration :
<code>sudo pam-auth-update</code>

==== Générer les uidNumber et gidNumber dans l'AD ====
Le script suivant permet d'ajouter les uidNumber et gidNumber pour chaque utilisateur et chaque groupe de l'AD.
<note important>Ce script nécessite des droits élevés permettant d'écrite dans l'AD (p.ex. : root via la commande //sudo//). Une mauvaise exécution de ce script pourrait endommager AD ou faire perdre des données.</note>
<file bash uid-gid_master.sh>
#!/bin/bash

# Vérifier si ces valeurs existent dans smb.conf
# idmap config REALM:range = min-max
rangeMin=100000
rangeMax=999999

sam=/var/lib/samba/private/sam.ldb

createTmpDir() {
  tmpDir=$(mktemp -d --tmpdir addGid.XXXXXX) || exit 1
  tmpRecord=$tmpDir/record_
  tmpLdif=$tmpDir/ldif
}
cleanTmpDir() {
  rm $tmpDir/*
}
removeTmpDir() {
  rm -r $tmpDir
}
                                                                                                                                                                                              
findMaxId() {                                                                                                                                                                                 
  ldbsearch -H $sam "$regexp" $field | sed '/^# Referral/ { :loop; N; $! b loop; d; }; s/^\([a-zA-Z0-9]*\): \(.*\)$/\1="\2"/g; /^$/d;' | awk '/^# record/{n++}{print > f n}' f=$tmpRecord     
                                                                                                                                                                                              
  maxID=$rangeMin                                                                                                                                                                             
  for file in `grep -l -E "^$field=" ${tmpRecord}*`                                                                                                                                           
  do                                                                                                                                                                                          
    source $file                                                                                                                                                                              
    if [ ${!field} -gt $rangeMax ]
    then
      echo "Warning: $field ${!field} for $dn is bigger than max id $rangeMax" 1>&2
    elif [ ${!field} -lt $rangeMin ]
    then
      echo "Warning: $field ${!field} for $dn is lower than min id $rangeMin" 1>&2
    else
      [ ${!field} -gt $maxID ] && maxID=${!field}
    fi
  done

  echo "Max ID found for $field: $maxID"
}

addIdNumber() {
  for file in `grep -L -E "^$field=" ${tmpRecord}*`
  do
    ((maxID++))
    source $file
    echo "Adding $field: $maxID for dn: $dn"
    echo "dn: $dn
changetype: modify
add: $field
$field: $maxID" > $tmpLdif
    ldbmodify -H $sam $tmpLdif
  done
}

umask 0077
createTmpDir

field=uidNumber
regexp="(&(objectclass=user)(!(objectclass=computer)))"
findMaxId
addIdNumber
cleanTmpDir

field=gidNumber
regexp="(objectclass=group)"
findMaxId
addIdNumber
cleanTmpDir

removeTmpDir

exit 0
</file>


===== Informations optionnelles et complémentaires =====
...
===== Références =====
...
//Contributeurs principaux : [[utilisateurs:bcag2|bcag2]], [[:utilisateurs:Qedinux|Qedinux]]//